home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Celestin Apprentice 5
/
Apprentice-Release5.iso
/
Environments
/
PowerMacOberon feb96
/
Source
/
Clipboard.Mod
(
.txt
)
< prev
next >
Wrap
Oberon Text
|
1995-05-04
|
4KB
|
119 lines
Syntax10.Scn.Fnt
StampElems
Alloc
4 May 95
ParcElems
Alloc
Syntax10i.Scn.Fnt
MODULE Clipboard; (** mf / mah 29.8.94 (
IMPORT Kernel, Texts, TextFrames, Macintosh, Oberon, MenuViewers, Viewers, Fonts;
TYPE
Scrap=POINTER TO ScrapDesc;
ScrapDesc=RECORD (Texts.TextDesc) (* extension of standard TextDesc in order to keep track of changes *)
changed: BOOLEAN
END;
scrap: Scrap; ClipB: Texts.Buffer; M: Oberon.CopyOverMsg; W: Texts.Writer;
PROCEDURE ConvertCharFromOberon (VAR ch: CHAR);
BEGIN
CASE ch OF
': ch := CHR (138)
| '
': ch := CHR (154)
| '
': ch := CHR (159)
(* | '
': ch := CHR (128) *)
| '
': ch := CHR (133)
| '
': ch := CHR (134)
ELSE
END
END ConvertCharFromOberon;
PROCEDURE ConvertCharToOberon (VAR ch: CHAR);
BEGIN
CASE ORD (ch) OF
138: ch := '
| 154: ch := '
| 159: ch := '
(* | 128: ch := '
| 133: ch := '
| 134: ch := '
ELSE
END
END ConvertCharToOberon;
PROCEDURE Cut*;
VAR t: Texts.Text; beg, end, time: LONGINT;
BEGIN
Texts.Delete (scrap, 0, scrap.len);
Oberon.GetSelection (t, beg, end, time);
IF time >= 0 THEN Texts.Save (t, beg, end, ClipB); Texts.Delete (t, beg, end); Texts.Append (scrap, ClipB) END;
END Cut;
PROCEDURE Copy*;
VAR t: Texts.Text; beg, end, time: LONGINT;
BEGIN
Texts.Delete (scrap, 0, scrap.len);
Oberon.GetSelection (t, beg, end, time);
IF time >= 0 THEN Texts.Save(t, beg, end, ClipB); Texts.Append(scrap, ClipB) END
END Copy;
PROCEDURE Paste*;
BEGIN
IF scrap.len > 0 THEN
M.text:=scrap; M.beg:=0; M.end:=scrap.len;
Oberon.FocusViewer.handle (Oberon.FocusViewer, M)
END
END Paste;
PROCEDURE Show*;
VAR V: Viewers.Viewer; X, Y: INTEGER;
BEGIN
Oberon.AllocateUserViewer (Oberon.Par.vwr.X, X, Y);
V:=MenuViewers.New (TextFrames.NewMenu ("Clipboard", "^Edit.Menu.Text"),
TextFrames.NewText (scrap, 0), TextFrames.menuH, X, Y)
END Show;
PROCEDURE* Import;
VAR run: ARRAY 1024 OF CHAR; i, len: INTEGER; fname: ARRAY 32 OF CHAR;
BEGIN
IF Macintosh.convertClip THEN
Texts.Delete (scrap, 0, scrap.len);
Macintosh.GetScrap; Macintosh.GetRun (run, len, fname);
WHILE len > 0 DO
Texts.SetFont (W, Fonts.This (fname)); i:=0;
WHILE i < len DO
ConvertCharToOberon (run[i]);
Texts.Write (W, run[i]);
INC (i)
END;
Macintosh.GetRun (run, len, fname)
END;
Texts.Append (scrap, W.buf); scrap.changed:=FALSE
END
END Import;
PROCEDURE* Export;
VAR R: Texts.Reader; run: ARRAY 1024 OF CHAR; ch: CHAR; len: INTEGER; fnt: Fonts.Font;
BEGIN
IF Macintosh.convertClip & scrap.changed THEN
Texts.OpenReader (R, scrap, 0); Texts.Read (R, ch);
WHILE ~R.eot DO
run[0]:=ch; fnt:=R.fnt; len:=1; Texts.Read (R, ch);
WHILE (~R.eot) & (R.fnt=fnt) & (len < 1024) DO
ConvertCharFromOberon (ch); run[len]:=ch;
Texts.Read (R, ch); INC (len)
END;
Macintosh.PutRun (run, len, fnt.name)
END;
Macintosh.PutScrap; scrap.changed:=FALSE
END
END Export;
PROCEDURE* Notify (T: Texts.Text; op: INTEGER; beg, end: LONGINT);
BEGIN
T(Scrap).changed:=TRUE;
TextFrames.NotifyDisplay (T, op, beg, end)
END Notify;
BEGIN
Texts.OpenWriter (W); NEW (ClipB); Texts.OpenBuf (ClipB);
NEW (scrap); scrap.notify:=Notify; Texts.Open (scrap, "");
Macintosh.suspendQ.Add (Export); Kernel.quitQ.Add (Export);
Macintosh.resumeQ.Add (Import);
Macintosh.convertClip:=TRUE; Import
END Clipboard.